home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 33
/
Aminet 33 - October 1999.iso
/
Aminet
/
comm
/
misc
/
DigiCam.lha
/
src
/
cameraops.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-15
|
12KB
|
481 lines
/* cameraops.c (c) 1999 by Volker Remuß, remuss@cs.tu-berlin.de */
/* Camera */
#include "cameraops.h"
#include "camera.h"
/* ANSI */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <string.h>
/* Amiga */
#include <proto/utility.h> // Stricmp
#define OutOfRange { printf("You Requested something out of Range, ignored.\n"); return(0); }
unsigned int32 makeint32(unsigned char *inbuf)
{
return (unsigned int32)(inbuf[0] | inbuf[1] << 8 | inbuf[2] << 16 | inbuf[3] << 24);
}
unsigned char *getvdatastring(int16 reg)
{
int16 size=0;
initgetvdatareg(reg);
if ((-1 == getdatapacket(buf, &size, 0, 0))
|| (size == 0))
{
buf[0]=0;
}
else
{
buf[size]=0;
}
return(buf);
}
int16 dircamera(void)
{
int16 frames;
int16 size;
int16 i;
int32 time;
char *datestring;
frames = getint32reg(FRAMES_TAKEN);
printf("\nStill Images\n");
printf(" No. Imagesz Thumbsz Audiosz R P Date ? ?\n");
for (i=1; i <= frames; i++)
{
if (putint32reg(CURRENT_FRAME, i)) return (-1);
initgetvdatareg(PICTURE_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
buf[0] = 0;
time = makeint32(buf+20);
datestring = asctime(gmtime((time_t *)&time));
datestring[24] = 20;
printf(" %3d %8d %8d %8d %2d %2d %26s %2d %2d\n",
i,
makeint32(buf ),
makeint32(buf+ 4),
makeint32(buf+ 8),
makeint32(buf+12),
makeint32(buf+16),
datestring,
makeint32(buf+24),
makeint32(buf+28));
}
initgetvdatareg(CAMERA_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
frames = makeint32(buf+28);
printf("\nAnimations\n");
printf(" No. Animsz Thumbsz Audiosz R P Date ? ?\n");
for (i=1; i <= frames; i++)
{
if (putint32reg(CURRENT_FRAME, (0xff << 24 | i))) return (-1);
initgetvdatareg(PICTURE_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
buf[0] = 0;
time = makeint32(buf+20);
datestring = asctime(gmtime((time_t *)&time));
datestring[24] = 20;
printf(" %3d %8d %8d %8d %2d %2d %26s %2d %2d\n",
i,
makeint32(buf ),
makeint32(buf+ 4),
makeint32(buf+ 8),
makeint32(buf+12),
makeint32(buf+16),
datestring,
makeint32(buf+24),
makeint32(buf+28));
}
return(0);
}
int16 saveframe(int32 frame, char *filename, int16 type)
{
int16 lastpack=0;
FILE *fh;
int16 size;
int16 seqnr;
int16 lastseqnr=-1;
int16 cycles;
if (!(fh = fopen(filename, "wb")))
{
printf("File error: %s\n", strerror(errno));
return(-1);
}
printf("%s ", filename);
cycles=0;
putint32reg(CURRENT_FRAME, frame);
switch (type)
{
case PICT: initgetvdatareg(14); break;
case ANIM: initgetvdatareg(14); break;
case THUMB: initgetvdatareg(15); break;
case AUDIO: initgetvdatareg(44); break;
default: initgetvdatareg(15); break;
}
while (!(lastpack))
{
if ((-1 == getdatapacket(buf, &size, &lastpack, &seqnr))
|| (((lastseqnr + 1) & 0xff) != seqnr) // Modulo 256 since especially Anims can be longer than 255 packages but sequencenumber has only 8 Bit
|| (size == 0))
{
fclose(fh);
printf("Download failed.\n");
remove(filename);
return(-1);
}
lastseqnr++;
fwrite(buf, size, 1, fh);
printf(".");
cycles++;
if ((!(lastpack)) && cycles && (!(cycles % 10))) printf("%dk", cycles<<1);
fflush(stdout);
}
fclose(fh);
printf("\n");
return(0);
}
int16 camerainfo(void)
{
int32 time;
char *datestring;
printf("\n");
printf("Manufacturer : %s\n", getvdatastring(MANUFACTURER));
printf("Model : %s\n", getvdatastring(MODEL));
printf("Version : %s\n", getvdatastring(VERSION));
printf("Camera I.D. : %s\n", getvdatastring(CAMERA_ID));
time = getint32reg(CLOCK);
datestring = asctime(gmtime((time_t *)&time));
printf("Cameratime : %s", datestring);
printf("\n");
printf("Frames Taken : %d\n", getint32reg(FRAMES_TAKEN));
printf("Frames Left : %d\n", getint32reg(FRAMES_LEFT));
printf("Free Mem : %d\n", getint32reg(FREEMEM));
printf("Battery Capacity : %d%%\n", getint32reg(BATTERY));
printf("Resolution : %d\n", getint32reg(RESOLUTION));
printf("Shutter Speed : %d\n", getint32reg(SHUTTER_SPEED));
printf("Flash Mode : %d\n", getint32reg(FLASH_MODE));
printf("Lens Mode : %d\n", getint32reg(LENS_MODE));
printf("Autoshut on host : %d\n", getint32reg(AUTOSHUT_ON_HOST));
printf("Autoshut in field: %d\n", getint32reg(AUTOSHUT_IN_FIELD));
printf("LCD Shutdowntime : %d\n", getint32reg(LCD_AUTOSHUT));
printf("LCD Dateformat : %d\n", getint32reg(LCD_DATE));
printf("LCD Brightness : %d\n", getint32reg(LCD_BRIGHTNESS));
printf("Aperture : %d\n", getint32reg(APERTURE));
printf("Color Mode : %d\n", getint32reg(COLOR_MODE));
printf("Exposure Meter : %d\n", getint32reg(EXP_METER));
printf("Bitmap : %d\n", getint32reg(BITMAP));
printf("Bright./Contrast : %d\n", getint32reg(BRIGHTNESS_CONTRAST));
printf("White Balance : %d\n", getint32reg(WHITE_BALANCE));
return(0);
}
int16 saveframerange(char *range, int16 type, char *filename, char *stringbuf)
/*
Saves a range of pictures or thumbnails, All, Range or single - Thumbs or Frames
range : is "all" "xx-yy" or a single "xx"
type : is PICT or THUMB to save
filename : the basename for the filename, suffix will be generated
stringbuf: has to be big enough to keep filename + generated suffix
*/
{
int32 i;
int32 res;
int32 framecount;
char *tmpstr;
if (!(filename))
{
printf("Filename needed!\n");
return(-1);
}
framecount = getint32reg(FRAMES_TAKEN);
if (!(Stricmp("all", range))) // save all?
{
for (i=1; i <= framecount; i++)
{
if (type == THUMB)
sprintf(stringbuf, "%s_%dth.jpg", filename, i);
else
sprintf(stringbuf, "%s_%d.jpg", filename, i);
saveframe(i, stringbuf, type);
}
}
else
{
if (tmpstr=strstr(range, "-")) // save range?
{
tmpstr[0] = 0;
for (i=atoi(range); i <= atoi(tmpstr+1); i++)
{
if ((unsigned)i > (unsigned)framecount) OutOfRange;
if (type == THUMB)
sprintf(stringbuf, "%s_%dth.jpg", filename, i);
else
sprintf(stringbuf, "%s_%d.jpg", filename, i);
saveframe(i, stringbuf, type);
}
}
else // save single Frame/Thumb
{
if (((unsigned)(res=atoi(range))) > (unsigned)framecount) OutOfRange;
if (type == THUMB)
sprintf(stringbuf, "%s_%dth.jpg", filename, res);
else
sprintf(stringbuf, "%s_%d.jpg", filename, res);
saveframe(res, stringbuf, type);
}
}
return(0);
}
int16 saveanimrange(char *range, int16 type, char *filename, char *stringbuf)
/*
Saves a range of Anims, All, Range or single - Thumbs or Frames
range : is "all" "xx-yy" or a single "xx"
filename : the basename for the filename, suffix will be generated
stringbuf: has to be big enough to keep filename + generated suffix
Funtions is very similar to saveframerange and could be integrated
in it, loosing some clearity.
*/
{
int32 i;
int32 res;
int32 animcount;
int16 size;
char *tmpstr;
if (!(filename))
{
printf("Filename needed!\n");
return(-1);
}
initgetvdatareg(CAMERA_SUMMARY); // How many anims are there?
if (getdatapacket(buf, &size, 0, 0)) return (-1);
animcount = makeint32(buf+28);
if (!(Stricmp("all", range))) // save all?
{
for (i=1; i <= animcount; i++)
{
if (type == THUMB)
sprintf(stringbuf, "%s_%d_ath.jpg", filename, i);
else
sprintf(stringbuf, "%s_%d.avi", filename, i);
saveframe((0xff<<24 | i), stringbuf, type);
printf("Frame %x\n", (0xff<<24 | animcount));
}
}
else
{
if (tmpstr=strstr(range, "-")) // save range?
{
tmpstr[0] = 0; // cut string on "-"
for (i=atoi(range); i <= atoi(tmpstr+1); i++)
{
if ((unsigned)i > (unsigned)animcount) OutOfRange;
if (type == THUMB)
sprintf(stringbuf, "%s_%d_ath.jpg", filename, i);
else
sprintf(stringbuf, "%s_%d.avi", filename, i);
saveframe((0xff<<24 | i), stringbuf, type);
}
}
else // save single Frame/Thumb
{
if (((unsigned)(res = atoi(range))) > (unsigned)animcount) OutOfRange;
if (type == THUMB)
sprintf(stringbuf, "%s_%d_ath.jpg", filename, res);
else
sprintf(stringbuf, "%s_%d.avi", filename, res);
saveframe((0xff<<24 | res), stringbuf, type);
}
}
return(0);
}
int16 savewavs(char *range, char *filename, char *stringbuf)
/*
Saves a range of Wavs, All, Range or single
range : is "all" "xx-yy" or a single "xx"
filename : the basename for the filename, suffix will be generated
stringbuf: has to be big enough to keep filename + generated suffix
*/
{
int32 i;
int32 res;
int32 framecount;
int16 size;
char *tmpstr;
if (!(filename))
{
printf("Filename needed!\n");
return(-1);
}
framecount = getint32reg(FRAMES_TAKEN);
if (!(Stricmp("all", range))) // save all?
{
for (i=1; i <= framecount; i++)
{
sprintf(stringbuf, "%s_%d.wav", filename, i);
if (putint32reg(CURRENT_FRAME, i)) return (-1);
initgetvdatareg(PICTURE_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
if (makeint32(buf+ 8) > 0)
saveframe(i, stringbuf, AUDIO);
}
}
else
{
if (tmpstr=strstr(range, "-")) // save range?
{
tmpstr[0] = 0;
for (i=atoi(range); i <= atoi(tmpstr+1); i++)
{
if ((unsigned)i > (unsigned)framecount) OutOfRange;
sprintf(stringbuf, "%s_%d.wav", filename, i);
if (putint32reg(CURRENT_FRAME, i)) return (-1);
initgetvdatareg(PICTURE_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
if (makeint32(buf+ 8) > 0)
saveframe(i, stringbuf, AUDIO);
}
}
else // save single Frame/Thumb
{
if (((unsigned)(res=atoi(range))) > (unsigned)framecount) OutOfRange;
sprintf(stringbuf, "%s_%d.wav", filename, res);
if (putint32reg(CURRENT_FRAME, res)) return (-1);
initgetvdatareg(PICTURE_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
if (makeint32(buf+ 8) > 0)
saveframe(res, stringbuf, AUDIO);
}
}
return(0);
}
int16 eraserange(char *range, int16 type)
/*
Erase a range of Anims/Picts, All, Range or single
range : is "all" "xx-yy" or a single "xx"
type : PICT or ANIM
*/
{
int32 i;
int32 res;
int32 count;
int16 size;
char *tmpstr;
if (type == ANIM) // How many are there?
{
initgetvdatareg(CAMERA_SUMMARY);
if (getdatapacket(buf, &size, 0, 0)) return (-1);
count = makeint32(buf+28);
}
else
count = getint32reg(FRAMES_TAKEN);
if (!(Stricmp("all", range))) // save all?
{
for (i=1; i <= count; i++)
{
if (type == ANIM)
putint32reg(CURRENT_FRAME, 0xff<<24 | 1 );
else
putint32reg(CURRENT_FRAME, 1);
printf("Deleting %d\n", i);
takeaction(ERASE_CURRENT, 0);
}
}
else
{
if (tmpstr=strstr(range, "-")) // save range?
{
tmpstr[0] = 0; // cut string on "-"
for (res=i=atoi(range); i <= atoi(tmpstr+1); i++)
{
if ((unsigned)i > (unsigned)count) OutOfRange;
if (type == ANIM)
putint32reg(CURRENT_FRAME, 0xff<<24 | res );
else
putint32reg(CURRENT_FRAME, res);
printf("Deleting %d\n", i);
takeaction(ERASE_CURRENT, 0);
}
}
else // save single Frame/Thumb
{
if (((unsigned)(res = atoi(range))) > (unsigned)count) OutOfRange;
if (type == ANIM)
putint32reg(CURRENT_FRAME, 0xff<<24 | res );
else
putint32reg(CURRENT_FRAME, res);
printf("Deleting %d\n", res);
takeaction(ERASE_CURRENT, 0);
}
}
return(0);
}